//
//  main.m
//  07_内存管理
//
//  Created by dllo on 16/7/12.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Man.h"

int main(int argc, const char * argv[]) {
    // 内存问题:
    // 1.内存溢出:内存过多导致溢出,产生Crash
    // 2.野指针(过度释放):指针指向未知区域,指向一块被释放的内存
    // 内存管理的三种方式:
    // 1.垃圾回收机制:只有Mac上有
    // iOS
    // 2.MRC:手动管理引用计数
    // 3.ARC:自动管理引用计数(现在常用的)
    // ARC基于MRC进行管理,系统帮程序员添加了内存管理内容
    
    // retain,alloc,copy会对引用计数+1
    // release,autorelease会对引用计数-1
    // 当对象的引用计数为0时,系统会调用对应的dealloc方法
    
    // 引用计数
    // 注意:对对象操作完成后,在进行释放
    // 集合类型会对对象进行引用计数+1.
    // addObject会对对象进行引用计数+1
    Man *man1 = [[Man alloc] init];
    [man1 release];
    
    /*  协议:
     *  1.声明协议,声明协议方法
     *  2.签订协议
     *  3.实现协议方法
     */
    
    Man *man = [[Man alloc] init];
    
    /*
        如果想实现对象的拷贝:
        1.签订NSCopying协议
        2.实现协议方法copyWithZone
     */
    Man *newMan = [man copy];
    NSLog(@"newMan: %@, man: %@", newMan, man);
    [man release];

    newMan.name = @"含蓄";
    newMan.sexual = @"nv";
    
    // KVC:Key-Value-Coding,键值编码,是一种间接访问成员的方式
    // 只要是NSObject的子类就包含这些方法
    id name = [newMan valueForKey:@"name"];
    NSLog(@"%@", name);
    [newMan setValue:@"徐康" forKey:@"name"];
    NSLog(@"%@", newMan.name);
    
    
    Man *gayMan = [[Man alloc] init];
    gayMan.gayBoy = newMan;
    id boyName = [gayMan valueForKeyPath:@"gayBoy.name"];
    NSLog(@"++++++++++%@", boyName);
    
    [gayMan setValue:@"李四" forKeyPath:@"gayBoy.name"];
    NSLog(@"%@", gayMan.gayBoy.name);
    
    [newMan release];
    
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [dic setValue:@"张三" forKey:@"name"];
    NSLog(@"%@", dic);
    
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys: @"123453", @"id", @"发么和好么", @"description", nil];
    Man *dicMan = [[Man alloc] init];
    [dicMan setValuesForKeysWithDictionary:dic2];
    
    NSLog(@"%@", dicMan);
    
    // 如果在ARC下使用MRC的文件-fno-objc-arc
    // 在MRC的工程下使用ARC的文件-fobjc-arc
    return 0;
}
